home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
System Booster
/
System Booster.iso
/
Archives
/
ForCLI
/
sum.lha
/
sum.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-04-03
|
4KB
|
160 lines
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <functions.h>
void CloseAll(char *s);
int sumfile(char *filename);
char ver[] = "$VER: sum 1.1 (3.4.94) © by Oliver Kaufmann";
char *usage = "usage: sum [-h|-?] [<filepatternlist>] [-p<pos>] [-q]\n\
-h : show usage\n\
-? : show usage\n\
<filepatternlist> : one or more files or filepatterns,\n\
if omitted, use stdin as input\n\
-p<pos> : start at position <pos> in every line\n\
-q : quiet, do not display verbose information\n";
struct MyAnchorPath {
struct AChain *ap_Base; /* pointer to first anchor */
struct AChain *ap_Last; /* pointer to last anchor */
LONG ap_BreakBits; /* Bits we want to break on */
LONG ap_FoundBreak; /* Bits we broke on. Also returns ERROR_BREAK */
BYTE ap_Flags; /* New use for extra word. */
BYTE ap_Reserved;
WORD ap_Strlen; /* This is what ap_Length used to be */
struct FileInfoBlock ap_Info;
UBYTE ap_Buf[256]; /* Buffer for path name, allocated by user */
};
#define MAXLEN 1024
struct FileInfoBlock *fib;
struct MyAnchorPath myap;
struct AnchorPath *ap;
unsigned long sum=0, n=0;
int pos=0;
int quietflag = 0;
char h[MAXLEN];
void main(int argc, char *argv[])
{
int i;
int flcount=0;
unsigned long sumalt, nalt;
int patcount = 0;
char *patfield[256];
char *filename;
sum = 0;
n = 0;
pos = 0; /* for tar index files pos = 14 */
for(i=1; i<argc; i++) {
if(*argv[i]=='-')
switch(*(argv[i]+1)) {
case 'p' : pos = 0;
sscanf(argv[i]+2,"%d", &pos);
break;
case 'q' : quietflag = 1;
break;
case '?' : printf(usage);
exit(0);
break;
case 'h' : printf(usage);
exit(0);
break;
}
else
patfield[patcount++] = argv[i];
}
if ( (pos > MAXLEN) || (pos<0) )
CloseAll("error: <pos> must be [0-255]");
ap = (struct AnchorPath*)&myap;
ap->ap_Strlen = 254;
ap->ap_BreakBits = 0;
if(patcount == 0) /* from stdin */
sumfile("*");
else
for( i=0; i<patcount ; i++) {
if ( MatchFirst(patfield[i], ap) ) {
printf("no match on %s\n",patfield[i]);
continue;
}
do {
fib = &ap->ap_Info;
if( fib->fib_DirEntryType > 0 ) /* exclude dirs */
continue;
sumalt = sum;
nalt = n;
if(sumfile(myap.ap_Buf)){ /* name and path */
flcount++;
if(!quietflag) {
printf("%-32s : %11lu in %7lu lines at column %3d\n",
myap.ap_Buf, sum-sumalt, n-nalt, pos);
}
}
} while (!MatchNext(ap));
MatchEnd(ap);
}
if(quietflag)
printf("%lu\n",sum);
else {
printf("-----------------------------------------------------------------------------\n");
printf("%3d file(s) total : %11lu in %7lu lines at column %3d\n",
flcount,sum,n,pos);
}
exit(0);
}
int sumfile(char *filename)
{
unsigned long fs;
FILE *f=NULL;
if( (f = fopen(filename, "r")) == NULL) {
printf("error: file %s not found\n",filename);
return 0;
}
h[pos] = '\0';
while(fgets(h,MAXLEN,f) != 0) {
n++;
fs = 0;
sscanf(&h[pos],"%lu",&fs);
sum += fs;
h[pos] = '\0';
}
fclose(f);
return 1;
}
void CloseAll(char *s)
{
if(s != NULL)
printf("%s\n",s);
exit(5);
}